!function(a, b) {
	if (typeof define === 'function' && define.amd) {
		// AMD. Register as an anonymous module.
		define([], function() {
			return b(a)
		});
	} else if (typeof module === 'object' && module.exports) {
		// Node. Does not work with strict CommonJS, but
		// only CommonJS-like environments that support module.exports,
		// like Node.
		module.exports = b(a);
	} else {
		// Browser globals (root is window)
		a.wx = b(a);
	}	
}(window, function(a, b) {
    function c(b, c, d) {
        a.WeixinJSBridge ? WeixinJSBridge.invoke(b, e(c), function(a) {
            g(b, a, d)
        }) : j(b, d)
    }
    function d(b, c, d) {
        a.WeixinJSBridge ? WeixinJSBridge.on(b, function(a) {
            d && d.trigger && d.trigger(a),
            g(b, a, c)
        }) : d ? j(b, d) : j(b, c)
    }
    function e(a) {
        return a = a || {},
        a.appId = E.appId,
        a.verifyAppId = E.appId,
        a.verifySignType = "sha1",
        a.verifyTimestamp = E.timestamp + "",
        a.verifyNonceStr = E.nonceStr,
        a.verifySignature = E.signature,
        a
    }
    function f(a) {
        return {
            timeStamp: a.timestamp + "",
            nonceStr: a.nonceStr,
            "package": a.package,
            paySign: a.paySign,
            signType: a.signType || "SHA1"
        }
    }
    function g(a, b, c) {
        var d, e, f;
        switch (delete b.err_code,
        delete b.err_desc,
        delete b.err_detail,
        d = b.errMsg,
        d || (d = b.err_msg,
        delete b.err_msg,
        d = h(a, d),
        b.errMsg = d),
        c = c || {},
        c._complete && (c._complete(b),
        delete c._complete),
        d = b.errMsg || "",
        E.debug && !c.isInnerInvoke && alert(JSON.stringify(b)),
        e = d.indexOf(":"),
        f = d.substring(e + 1)) {
        case "ok":
            c.success && c.success(b);
            break;
        case "cancel":
            c.cancel && c.cancel(b);
            break;
        default:
            c.fail && c.fail(b)
        }
        c.complete && c.complete(b)
    }
    function h(a, b) {
        var e, f, c = a, d = p[c];
        return d && (c = d),
        e = "ok",
        b && (f = b.indexOf(":"),
        e = b.substring(f + 1),
        "confirm" == e && (e = "ok"),
        "failed" == e && (e = "fail"),
        -1 != e.indexOf("failed_") && (e = e.substring(7)),
        -1 != e.indexOf("fail_") && (e = e.substring(5)),
        e = e.replace(/_/g, " "),
        e = e.toLowerCase(),
        ("access denied" == e || "no permission to execute" == e) && (e = "permission denied"),
        "config" == c && "function not exist" == e && (e = "ok"),
        "" == e && (e = "fail")),
        b = c + ":" + e
    }
    function i(a) {
        var b, c, d, e;
        if (a) {
            for (b = 0,
            c = a.length; c > b; ++b)
                d = a[b],
                e = o[d],
                e && (a[b] = e);
            return a
        }
    }
    function j(a, b) {
        if (!(!E.debug || b && b.isInnerInvoke)) {
            var c = p[a];
            c && (a = c),
            b && b._complete && delete b._complete,
            console.log('"' + a + '",', b || "")
        }
    }
    function k() {
        0 != D.preVerifyState && (u || v || E.debug || "6.0.2" > z || D.systemType < 0 || A || (A = !0,
        D.appId = E.appId,
        D.initTime = C.initEndTime - C.initStartTime,
        D.preVerifyTime = C.preVerifyEndTime - C.preVerifyStartTime,
        H.getNetworkType({
            isInnerInvoke: !0,
            success: function(a) {
                var b, c;
                D.networkType = a.networkType,
                b = "http://open.weixin.qq.com/sdk/report?v=" + D.version + "&o=" + D.preVerifyState + "&s=" + D.systemType + "&c=" + D.clientVersion + "&a=" + D.appId + "&n=" + D.networkType + "&i=" + D.initTime + "&p=" + D.preVerifyTime + "&u=" + D.url,
                c = new Image,
                c.src = b
            }
        })))
    }
    function l() {
        return (new Date).getTime()
    }
    function m(b) {
        w && (a.WeixinJSBridge ? b() : q.addEventListener && q.addEventListener("WeixinJSBridgeReady", b, !1))
    }
    function n() {
        H.invoke || (H.invoke = function(b, c, d) {
            a.WeixinJSBridge && WeixinJSBridge.invoke(b, e(c), d)
        }
        ,
        H.on = function(b, c) {
            a.WeixinJSBridge && WeixinJSBridge.on(b, c)
        }
        )
    }
    var o, p, q, r, s, t, u, v, w, x, y, z, A, B, C, D, E, F, G, H;
    if (!a.jWeixin)
        return o = {
            config: "preVerifyJSAPI",
            onMenuShareTimeline: "menu:share:timeline",
            onMenuShareAppMessage: "menu:share:appmessage",
            onMenuShareQQ: "menu:share:qq",
            onMenuShareWeibo: "menu:share:weiboApp",
            onMenuShareQZone: "menu:share:QZone",
            previewImage: "imagePreview",
            getLocation: "geoLocation",
            openProductSpecificView: "openProductViewWithPid",
            addCard: "batchAddCard",
            openCard: "batchViewCard",
            chooseWXPay: "getBrandWCPayRequest"
        },
        p = function() {
            var b, a = {};
            for (b in o)
                a[o[b]] = b;
            return a
        }(),
        q = a.document,
        r = q.title,
        s = navigator.userAgent.toLowerCase(),
        t = navigator.platform.toLowerCase(),
        u = !(!t.match("mac") && !t.match("win")),
        v = -1 != s.indexOf("wxdebugger"),
        w = -1 != s.indexOf("micromessenger"),
        x = -1 != s.indexOf("android"),
        y = -1 != s.indexOf("iphone") || -1 != s.indexOf("ipad"),
        z = function() {
            var a = s.match(/micromessenger\/(\d+\.\d+\.\d+)/) || s.match(/micromessenger\/(\d+\.\d+)/);
            return a ? a[1] : ""
        }(),
        A = !1,
        B = !1,
        C = {
            initStartTime: l(),
            initEndTime: 0,
            preVerifyStartTime: 0,
            preVerifyEndTime: 0
        },
        D = {
            version: 1,
            appId: "",
            initTime: 0,
            preVerifyTime: 0,
            networkType: "",
            preVerifyState: 1,
            systemType: y ? 1 : x ? 2 : -1,
            clientVersion: z,
            url: encodeURIComponent(location.href)
        },
        E = {},
        F = {
            _completes: []
        },
        G = {
            state: 0,
            data: {}
        },
        m(function() {
            C.initEndTime = l()
        }),
        H = {
            config: function(a) {
                E = a,
                j("config", a);
                var b = E.check === !1 ? !1 : !0;
                m(function() {
                    var a, d, e;
                    if (b)
                        c(o.config, {
                            verifyJsApiList: i(E.jsApiList)
                        }, function() {
                            F._complete = function(a) {
                                C.preVerifyEndTime = l(),
                                G.state = 1,
                                G.data = a
                            }
                            ,
                            F.success = function() {
                                D.preVerifyState = 0
                            }
                            ,
                            F.fail = function(a) {
                                F._fail ? F._fail(a) : G.state = -1
                            }
                            ;
                            var a = F._completes;
                            return a.push(function() {
                                k()
                            }),
                            F.complete = function() {
                                for (var c = 0, d = a.length; d > c; ++c)
                                    a[c]();
                                F._completes = []
                            }
                            ,
                            F
                        }()),
                        C.preVerifyStartTime = l();
                    else {
                        for (G.state = 1,
                        a = F._completes,
                        d = 0,
                        e = a.length; e > d; ++d)
                            a[d]();
                        F._completes = []
                    }
                }),
                E.beta && n()
            },
            ready: function(a) {
                0 != G.state ? a() : (F._completes.push(a),
                !w && E.debug && a())
            },
            error: function(a) {
                "6.0.2" > z || B || (B = !0,
                -1 == G.state ? a(G.data) : F._fail = a)
            },
            checkJsApi: function(a) {
                var b = function(a) {
                    var c, d, b = a.checkResult;
                    for (c in b)
                        d = p[c],
                        d && (b[d] = b[c],
                        delete b[c]);
                    return a
                };
                c("checkJsApi", {
                    jsApiList: i(a.jsApiList)
                }, function() {
                    return a._complete = function(a) {
                        if (x) {
                            var c = a.checkResult;
                            c && (a.checkResult = JSON.parse(c))
                        }
                        a = b(a)
                    }
                    ,
                    a
                }())
            },
            onMenuShareTimeline: function(a) {
                d(o.onMenuShareTimeline, {
                    complete: function() {
                        c("shareTimeline", {
                            title: a.title || r,
                            desc: a.title || r,
                            img_url: a.imgUrl || "",
                            link: a.link || location.href,
                            type: a.type || "link",
                            data_url: a.dataUrl || ""
                        }, a)
                    }
                }, a)
            },
            onMenuShareAppMessage: function(a) {
                d(o.onMenuShareAppMessage, {
                    complete: function() {
                        c("sendAppMessage", {
                            title: a.title || r,
                            desc: a.desc || "",
                            link: a.link || location.href,
                            img_url: a.imgUrl || "",
                            type: a.type || "link",
                            data_url: a.dataUrl || ""
                        }, a)
                    }
                }, a)
            },
            onMenuShareQQ: function(a) {
                d(o.onMenuShareQQ, {
                    complete: function() {
                        c("shareQQ", {
                            title: a.title || r,
                            desc: a.desc || "",
                            img_url: a.imgUrl || "",
                            link: a.link || location.href
                        }, a)
                    }
                }, a)
            },
            onMenuShareWeibo: function(a) {
                d(o.onMenuShareWeibo, {
                    complete: function() {
                        c("shareWeiboApp", {
                            title: a.title || r,
                            desc: a.desc || "",
                            img_url: a.imgUrl || "",
                            link: a.link || location.href
                        }, a)
                    }
                }, a)
            },
            onMenuShareQZone: function(a) {
                d(o.onMenuShareQZone, {
                    complete: function() {
                        c("shareQZone", {
                            title: a.title || r,
                            desc: a.desc || "",
                            img_url: a.imgUrl || "",
                            link: a.link || location.href
                        }, a)
                    }
                }, a)
            },
            startRecord: function(a) {
                c("startRecord", {}, a)
            },
            stopRecord: function(a) {
                c("stopRecord", {}, a)
            },
            onVoiceRecordEnd: function(a) {
                d("onVoiceRecordEnd", a)
            },
            playVoice: function(a) {
                c("playVoice", {
                    localId: a.localId
                }, a)
            },
            pauseVoice: function(a) {
                c("pauseVoice", {
                    localId: a.localId
                }, a)
            },
            stopVoice: function(a) {
                c("stopVoice", {
                    localId: a.localId
                }, a)
            },
            onVoicePlayEnd: function(a) {
                d("onVoicePlayEnd", a)
            },
            uploadVoice: function(a) {
                c("uploadVoice", {
                    localId: a.localId,
                    isShowProgressTips: 0 == a.isShowProgressTips ? 0 : 1
                }, a)
            },
            downloadVoice: function(a) {
                c("downloadVoice", {
                    serverId: a.serverId,
                    isShowProgressTips: 0 == a.isShowProgressTips ? 0 : 1
                }, a)
            },
            translateVoice: function(a) {
                c("translateVoice", {
                    localId: a.localId,
                    isShowProgressTips: 0 == a.isShowProgressTips ? 0 : 1
                }, a)
            },
            chooseImage: function(a) {
                c("chooseImage", {
                    scene: "1|2",
                    count: a.count || 9,
                    sizeType: a.sizeType || ["original", "compressed"],
                    sourceType: a.sourceType || ["album", "camera"]
                }, function() {
                    return a._complete = function(a) {
                        if (x) {
                            var b = a.localIds;
                            b && (a.localIds = JSON.parse(b))
                        }
                    }
                    ,
                    a
                }())
            },
            previewImage: function(a) {
                c(o.previewImage, {
                    current: a.current,
                    urls: a.urls
                }, a)
            },
            uploadImage: function(a) {
                c("uploadImage", {
                    localId: a.localId,
                    isShowProgressTips: 0 == a.isShowProgressTips ? 0 : 1
                }, a)
            },
            downloadImage: function(a) {
                c("downloadImage", {
                    serverId: a.serverId,
                    isShowProgressTips: 0 == a.isShowProgressTips ? 0 : 1
                }, a)
            },
            getNetworkType: function(a) {
                var b = function(a) {
                    var c, d, e, b = a.errMsg;
                    if (a.errMsg = "getNetworkType:ok",
                    c = a.subtype,
                    delete a.subtype,
                    c)
                        a.networkType = c;
                    else
                        switch (d = b.indexOf(":"),
                        e = b.substring(d + 1)) {
                        case "wifi":
                        case "edge":
                        case "wwan":
                            a.networkType = e;
                            break;
                        default:
                            a.errMsg = "getNetworkType:fail"
                        }
                    return a
                };
                c("getNetworkType", {}, function() {
                    return a._complete = function(a) {
                        a = b(a)
                    }
                    ,
                    a
                }())
            },
            openLocation: function(a) {
                c("openLocation", {
                    latitude: a.latitude,
                    longitude: a.longitude,
                    name: a.name || "",
                    address: a.address || "",
                    scale: a.scale || 28,
                    infoUrl: a.infoUrl || ""
                }, a)
            },
            getLocation: function(a) {
                a = a || {},
                c(o.getLocation, {
                    type: a.type || "wgs84"
                }, function() {
                    return a._complete = function(a) {
                        delete a.type
                    }
                    ,
                    a
                }())
            },
            hideOptionMenu: function(a) {
                c("hideOptionMenu", {}, a)
            },
            showOptionMenu: function(a) {
                c("showOptionMenu", {}, a)
            },
            closeWindow: function(a) {
                a = a || {},
                c("closeWindow", {}, a)
            },
            hideMenuItems: function(a) {
                c("hideMenuItems", {
                    menuList: a.menuList
                }, a)
            },
            showMenuItems: function(a) {
                c("showMenuItems", {
                    menuList: a.menuList
                }, a)
            },
            hideAllNonBaseMenuItem: function(a) {
                c("hideAllNonBaseMenuItem", {}, a)
            },
            showAllNonBaseMenuItem: function(a) {
                c("showAllNonBaseMenuItem", {}, a)
            },
            scanQRCode: function(a) {
                a = a || {},
                c("scanQRCode", {
                    needResult: a.needResult || 0,
                    scanType: a.scanType || ["qrCode", "barCode"]
                }, function() {
                    return a._complete = function(a) {
                        var b, c;
                        y && (b = a.resultStr,
                        b && (c = JSON.parse(b),
                        a.resultStr = c && c.scan_code && c.scan_code.scan_result))
                    }
                    ,
                    a
                }())
            },
            openProductSpecificView: function(a) {
                c(o.openProductSpecificView, {
                    pid: a.productId,
                    view_type: a.viewType || 0,
                    ext_info: a.extInfo
                }, a)
            },
            addCard: function(a) {
                var e, f, g, h, b = a.cardList, d = [];
                for (e = 0,
                f = b.length; f > e; ++e)
                    g = b[e],
                    h = {
                        card_id: g.cardId,
                        card_ext: g.cardExt
                    },
                    d.push(h);
                c(o.addCard, {
                    card_list: d
                }, function() {
                    return a._complete = function(a) {
                        var c, d, e, b = a.card_list;
                        if (b) {
                            for (b = JSON.parse(b),
                            c = 0,
                            d = b.length; d > c; ++c)
                                e = b[c],
                                e.cardId = e.card_id,
                                e.cardExt = e.card_ext,
                                e.isSuccess = e.is_succ ? !0 : !1,
                                delete e.card_id,
                                delete e.card_ext,
                                delete e.is_succ;
                            a.cardList = b,
                            delete a.card_list
                        }
                    }
                    ,
                    a
                }())
            },
            chooseCard: function(a) {
                c("chooseCard", {
                    app_id: E.appId,
                    location_id: a.shopId || "",
                    sign_type: a.signType || "SHA1",
                    card_id: a.cardId || "",
                    card_type: a.cardType || "",
                    card_sign: a.cardSign,
                    time_stamp: a.timestamp + "",
                    nonce_str: a.nonceStr
                }, function() {
                    return a._complete = function(a) {
                        a.cardList = a.choose_card_info,
                        delete a.choose_card_info
                    }
                    ,
                    a
                }())
            },
            openCard: function(a) {
                var e, f, g, h, b = a.cardList, d = [];
                for (e = 0,
                f = b.length; f > e; ++e)
                    g = b[e],
                    h = {
                        card_id: g.cardId,
                        code: g.code
                    },
                    d.push(h);
                c(o.openCard, {
                    card_list: d
                }, a)
            },
            chooseWXPay: function(a) {
                c(o.chooseWXPay, f(a), a)
            }
        },
        b && (a.wx = a.jWeixin = H),
        H
});
